﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace YasharEl.Infrastructure.SoftwareModel.SOA
{
    /// <summary>
    /// Communication Services transport messages into, out of, 
    /// and within the system without being concerned with the content of the messages. 
    /// For example, a bridge may move messages back and forth across a network barrier 
    /// (that is, bridging two otherwise disconnected networks) or across a protocol barrier 
    /// (such as moving queued messages between IBM's WebSphere MQ queuing system and Microsoft's MSMQ queuing system). 
    /// Examples of Communication Services include relays/bridges/routers/gateways, publish-subscribe systems, and queues.
    /// 
    /// Communication Services do not hold any application state, 
    /// but in many cases they are configured to work in concert with the applications that use them. 
    /// A particular application may need to instruct 
    /// or configure a Communication Service on how to move the messages 
    /// flowing inside that application such that intercomponent communication 
    /// is made possible in a loosely coupled architecture. 
    /// 
    /// For example, a content-based router may require the application to provide 
    /// routing instructions such that the router will know where to forward messages. 
    /// 
    /// Another example may be a publish-subscribe service 
    /// that will deliver messages to registered subscribers based on a 
    /// filter that can be applied to the message's content. 
    /// This filter will be set by the application. 
    /// In both cases, the Communication Service does not process 
    /// the content of the message but rather (optionally) 
    /// uses parts of it as instructed in advance by the application 
    /// for determining where it should go.
    /// In addition to application-specific requirements, 
    /// restrictions imposed by security, regulatory, 
    /// or other sources of constraints may dictate that in order to use the facilities 
    /// offered by a particular Communication Service, 
    /// users will need to possess certain permissions. 
    /// These permissions can be set at the application scope 
    /// (allowing an application to use the service regardless of which user is using the application), 
    /// at the user scope (allowing a specific user to use the service regardless of which application that the user is using), 
    /// or at both scopes (allowing the specific user to access the service while running a specific application).
    /// 
    /// For example, a publish-subscribe service may be configured 
    /// to restrict access to specific topics by only allowing specific users to subscribe to them.
    /// Other application-level facilities that may be 
    /// offered by Communication Services pertain to monitoring, 
    /// diagnostics, and business activity monitoring (BAM). 
    /// Communication Services may provide statistical information about the application 
    /// such as an analysis of message traffic patterns (how many messages are flowing through a bridge per minute), 
    /// error rate reports (how many SOAP faults are being sent through a router per day), 
    /// or business-level performance indicators (how many purchase orders are coming in through a partner's gateway). 
    /// Although they may be specific to a particular application, 
    /// these capabilities are not different than the configuration settings used to control message flow. 
    /// This information is typically provided by a generic feature of the Communication Service, 
    /// which often needs to be configured by the application. 
    /// The statistical information being provided typically needs 
    /// to be consumed by a specific part of the application 
    /// that knows what to do with it
    /// (raise a security alert at the data center, or update a BAM-related chart on the CFO's computer screen, for example). 
    /// </summary>
    public interface ICommunicationService : IInfrastructureService
    {
    }
}
